#ifndef __CARD_READER_H
#define __CARD_READER_H

#include "t_types.h"
#include "vz_app.h"

/*
通讯数据帧结构：
串口波特率：115200bps，8数据位，1结束位，无校验位
PC'CardReader：
	帧头：		1个字节		FF		//帧开始标志
	帧序列号：	1个字节		00~07（从00~07，不断循环）
	命令字：	1个字节		
	数据长度：	1个字节
	数据：		长度由数据长度字节决定
	校验码：	1个字节		异或校验值（对 从帧头到数据的最后一个字节 进行异或的值）
CardReader ' PC：
	帧头：		1个字节		FF		//帧开始标志
	帧序列号：	1个字节		00~07	//响应PC命令时和PC发送帧的序列号一致
	命令字：	1个字节		如果成功响应则该值为00，	如果命令操作失败则返回失败码
	数据长度：	1个字节		
	数据：		长度由数据长度字节决定
	校验码：	1个字节		异或校验值（对 从帧头到数据的最后一个字节 进行异或的值）
*/

#define PROTOCOL1_RECV_BUF_LEN (1024)
#define PROTOCOL1_SEND_BUF_LEN (1024)

#define PROTOCOL_CR_PROVINCE_CODE_GUANGDONG (44)
#define PROTOCOL_CR_CAR_NUM_RESULT_LEN (4)

typedef enum _PROTOCOL_CR_CARD_REQ_MODE_E
{
	PROTOCOL_CR_CARD_REQ_MODE_AUTO = 0,
	PROTOCOL_CR_CARD_REQ_MODE_POS1 = 1, // 非接触式
	PROTOCOL_CR_CARD_REQ_MODE_POS2 = 2, // 接触式
} PROTOCOL_CR_CARD_REQ_MODE_E;

typedef enum _PROTOCOL_CR_CARD_TYPE_E
{
	PROTOCOL_CR_CARD_TYPE_MF_PRO = 0x20, // MF-PRO卡(粤通卡)
	PROTOCOL_CR_CARD_TYPE_MF_ONE = 0x08, // MF-ONE卡(逻辑加密卡)
} PROTOCOL_CR_CARD_TYPE_E;

typedef enum _PROTOCOL_CR_CMD_TYPE_E
{
	PROTOCOL_CR_CMD_00H_RESPONSE_OK = 0x00,
	PROTOCOL_CR_CMD_70H_DEV_INIT_CONN = 0x70,
	PROTOCOL_CR_CMD_72H_CLOSE_MF_RF = 0x72,
	PROTOCOL_CR_CMD_80H_READ_CARD = 0x80, // OR 0X84
	PROTOCOL_CR_CMD_80H_ERR = 0xcd,		  // 如果卡片不存在或者读取失败，则返回命令字0xCD
} PROTOCOL_CR_CMD_TYPE_E;

typedef enum _PROTOCOL_PROVINCE_CODE_E
{
	PROTOCOL_PROVINCE_CODE_GUANGDONG = 0x44,
} PROTOCOL_PROVINCE_CODE_E;

struct _CARD_READER_HEAD_T
{
	T_UINT8 u8HeadFlag;	  //帧开始标志，固定为 FF
	T_UINT8 u8FrameIndex; // 00~07（从00~07，不断循环）
	T_UINT8 u8Cmd;		  // PROTOCOL_CR_CMD_TYPE_E
	T_UINT8 u8DataLen;
	T_UINT8 au8Data[0];
	//T_UINT8 u8Crc;
} __PACKED__;
typedef struct _CARD_READER_HEAD_T CARD_READER_HEAD_T;

typedef struct _PROTOCOL_CR_READ_CARD_S
{
	T_UINT32 u32CardNum;
	T_UINT8 u8CardType; // PROTOCOL_CR_CARD_TYPE_E
	T_UINT8 u8CardPos;	// 卡片放置区域  01-位置1  02 位置2
} __PACKED__;
typedef struct _PROTOCOL_CR_READ_CARD_S PROTOCOL_CR_READ_CARD_S;

typedef struct _PROTOCOL_CR_RESULT_S
{
	T_UINT8 au8CarNum[PROTOCOL_CR_CAR_NUM_RESULT_LEN];
} PROTOCOL_CR_RESULT_S;

T_INT32 PROTOCOL_CR_Init(void);
T_INT32 PROTOCOL_CR_DeInit(void);
T_INT32 PROTOCOL_CR_80H_ReadCard(void);
/* return: -2:no card; -1:error; 0:ok */
T_INT32 PROTOCOL_CR_GetCarNum(PROTOCOL_CR_RESULT_S *pstCarNumResult);

#endif
